Algoritmos evolutivos

Ejercicio 1

Implemente las estructuras de datos y algoritmos básicos para la solución de un problema mediante algoritmos genéticos. Pruebe estas rutinas para buscar el mínimo global de las siguientes funciones:

  • Función 1
# Definición de funciones a minimizar
funcion01 <- function(x){
  return(-x*sin(sqrt(abs(x))))
}
# Rango de la variable

xMin <- -512
xMax <- 512

resultado <- algoritmoGenetico(cantidadIndividuos = 5, limiteInf = xMin, limiteSup = xMax, generacionesSinCambio = 40, fitnessFn = function(x) {-funcion01(x)})
## mejor individuo proceso: 427.775835752487
x <- seq(-512, 512, length.out = 255)
y <- funcion01(x)
datos <- as.data.frame(cbind(x,y))


ggplot(data = datos, aes(x = x, y = y)) +
  geom_line() +
  labs(title = "funcion01") +
  theme_bw() +
  theme(legend.position = "none") +
  geom_vline(xintercept = resultado$mejor_individuo, color="red")

  • Función 2
funcion02 <- function(x){
  return(x+sin(3*x)+8*cos(5*x))
}

xMin <- 0
xMax <- 20

resultado <- algoritmoGenetico(cantidadIndividuos = 5, limiteInf = xMin, limiteSup = xMax, generacionesSinCambio = 40, fitnessFn = function(x) {-funcion02(x)})
## mejor individuo proceso: 1.85299611650407
x <- seq(xMin, xMax, length.out = 255)
y <- funcion02(x)
datos <- as.data.frame(cbind(x,y))

ggplot(data = datos, aes(x = x, y = y)) +
  geom_line() +
  labs(title = "funcion02") +
  theme_bw() +
  theme(legend.position = "none") +
  geom_vline(xintercept = resultado$mejor_individuo, color="red")

  • Función 3
funcion03 <- function(x, y){
  return((x^2+y^2)^0.25*(sin(50*(x^2+y^2)^0.1)^2+1))
}

xMin <- -100
xMax <-  100

resultado <- algoritmoGenetico(cantidadIndividuos = 5, cantidadVariables=2, limiteInf = c(xMin, xMin), limiteSup = c(xMax, xMax), generacionesSinCambio = 40, fitnessFn = function(x,y) {-funcion03(x,y)})
## mejor individuo proceso: 0.747412401510967, 0.747412401510967
x <- y <- seq(xMin, xMax, length.out = 255)
z <- outer(x, y,  funcion03)
nbcol = 100
color = rev(rainbow(nbcol, start = 0/6, end = 4/6))
zcol  = cut(z, nbcol)

p <- plot_ly(x = x, y = y, z = z) %>% add_surface(
  contours = list(
    z = list(
      show=TRUE,
      usecolormap=TRUE,
      highlightcolor="#ff0000",
      project=list(z=TRUE)
      )
    )
  ) %>%
  layout(
    scene = list(
      camera=list(
        eye = list(x=1.87, y=0.88, z=-0.64)
        )
      )
  )

p
resultado$mejor_individuo
## [1] 0.7474124 0.7474124

Preguntas

  • ¿Corresponde al mínimo global el valor encontrado? Repita la búsqueda varias veces y determine el valor medio y desvío.

  • ¿Se encuentra ahora el mínimo global dentro del intervalo?

Ejercicio 2

En el archivo desconocido1.csv se ha registrado información de un proceso que puede describirse mediante la ecuación: \[y1 = a_1x^3_1 + a_2 x^2_1 + a_3 x_1 + a_4\] Se sabe que las mediciones contienen ruido, y que los parámetro del sistema se encuentran acotados en el intervalo [−5,1.5]. Utilice un algoritmo genético para determinar los parámetros delmodelo. Calcule el error cuadrático total obtenido de la comparción entre los datos provistos y la función aproximada mediante el algoritmo. ¿Qué puede concluir del ajuste?

desconocido1 <- read_csv("../../PUBLICO/Encuentro 5/Práctica/desconocido1.csv", col_names = FALSE)
errorEj2 <- function(a1, a2, a3, a4){
  
  x <- desconocido1[, 1] %>% as.matrix(ncol=1) %>% t()
  y <- matrix(rep(desconocido1[, 2], length(a1)) %>% unlist(), ncol=length(x))
  
  # habrá 128 salidas por individuo (una por cada dato del dataset)
  # hay tantos individuos como se configure en el algoritmo (100 en este caso)
  salidaEstimada <- a1 %*% x^3 + a2 %*% x^2 +  a3 %*% x + a4
  # la matriz de error es de 100x128
  error <- y-salidaEstimada
  # los renglones representan a los individuos evaluados
  error_cuadratico_medio = rowMeans(error^2)
  
  return(error_cuadratico_medio)
}
# Rango de los parametros

xMin <- -5
xMax <- 1.5

resultado <- algoritmoGenetico(limiteInf = rep(xMin,4), limiteSup = rep(xMax,4), cantidadVariables = 4, fitnessFn = function(a1, a2, a3, a4) {-errorEj2(a1, a2, a3, a4)})
## mejor individuo proceso: 0.145790377515368, -0.365768822142854, -0.495343051617965, -2.96343403856736